分析现有报表


很惭愧,在报表组一年多了,却一直没有去好好分析下整个流程,常年累月的积累,代码量已经很大了,各种修修补补也看起来有一些困难.. 但为了实现在线表单,希望能从整个过程中得到一些启发,能够更好地实现在线表单的功能.. 花了接近一下午的时间,主要是分析下,报表渲染的过程.
1. 当添加一个报表后,就有了一个excel文件,以及一个xml文件.
2. excel主要存储样式,xml配合存储所用到的公式,数据源,渲染方式等. 3. 当设计好报表,预览的时候,首先是解析xml获取各个独立属性(将xml文件转换为内存的类对象),结合模板excel信息.知道了公式中的数据该对应哪些格子.
4. 根据公式中用到的数据源去查询结果,再根据公式中的配置做二次处理筛选.
5. 再根据公式类型,确定渲染规则,再结合公式中保存的单元格名称,将数据源信息设置到单元格上.
6. 然后再显示excel 7. 公式中用到的单元格名称,而非直接使用类似A1的坐标,理由是当插入删除行时,单元格名称不会变.

-- 如果想做,可以先做解析xml的. 也即通过cs客户端,做了简单的设计(比如用到了一个多记录公式,并已多记录类grid方式显示).
传递给你一个报表id.你获取到xml公式定义,进行解析,首先能得到数据源定义,并查询到真实数据..
就差解析excel文件,将数据源正确地显示..
ok???
了解了,这个过程,那么我要做的就是添加一个action,传入报表id,返回所定义的数据源数据..

ibfr

点击预览:
FormReportPreview 窗体属性 ReportObject 维护了一个ReportObject对象.很多报表所需要的属性都存在这个对象中. workbookView1 维护了一个spreatgear 报表控件
1. 重置图表位置 SetPictureNewPosition(); SetChartNewPosition(); 2. 传入报表id,构建FormReportPreview窗体 - 签入到主窗体中 (设置MdiParent属性) - 设置DatabaseCellList - 设置预览路径.(设置View_Report_Directory属性) - 报存文件到本地(调用workbookView1控件的save方法.报错的是存在服务端的xls模板文件) -调用,3,4更新服务器端的xml文件 --将xml文件保存在本地 3. 保存报表和用到的数据源之间的关系

  1. 保存公式.保证渲染方法一致 构建对象ReportObjManage,传入参数workbookView 和ReportObject 调用对象ReportObjManage的RepairRegionFormulaRelation 方法. -循环ReportObject内sheet,再循环sheet内page再循环page内的region,进行公式校验 --校验即循环ReportObject内的CellFormularItemList(是一个HashTable对象,key是单元格地址,value是FormulaOutParam对象) ------通过key找到区域range,通过value对象的FormulaName 到ReportObject中的ReportFormulaList 查找FormulaMultiBaseObj,如果能找到,则加到区域的FormulaObjList中.

然后调用ReportObject 的SaveFormula方法.保存公式(也即把公式对象转成xml保存到xml文件中) --先请空FormulaLinkRangeList 和 RangeLinkControlList 对象 --然后重新设置a.遍历CellFormularItemList获得value中的FormulaName.到FormulaDisplayObjList 查找FormulaDisplayObj 然后遍历该对象的LinkCellNameList.构建FormulaLinkRangeRelation.添加到FormulaLinkRangeList b.遍历CellDataItemExObjs...构建FormulaLinkRangeRelation.添加到RangeLinkControlList

--然后创建xml文件(调用CreateFormulaXML方法) xml中包含以下信息: 报表属性,报表公式列表,报表交叉表数据项关系列表,报表公式对应联动单元格列表,报表公式字段列对应联动单元格列表,报表单元格控件对应联动单元格列表, 填报单元格公式列表, 图表列表,组合公式,图片,----sheet列表,取数对象,报表校验,验证js,动态区域配置

5.准备show之前,调用了下PreviewReport 方法,成功则show -.具体获取数据源显示的过程全在previewReport里面完成的 --DisplayToUIEntrance 的PreviewReport 方法

  1. 提取报表文件:复制三个文件(包括模板xls,公式xml,和浏览的xls)
  2. 加载模版文件:使用spreadgear的方法,根据路径加载模板xls文件,得到IWorkbook对象[TempWorkbook]
  3. 加载公式文件:根据公式xml文件,构造ReportObj对象(重点在这里,读取报表属性,公式列表,单元格控件,显示值,图表等等)
    3.1 加载ReportObj报表属性(WorkbookPassword)
    3.2 加载ReportFormulaList报表公式列表属性(可能是FormulaBaseObj,FormulaCrosstabObj或FormulaGroupObj 对象,每个对象就是一个跟xml描述一样的类,将xml转换为类的属性值.不包含数据处理,只是xml转class
    3.3 加载ReportCrossDataItemList报表交叉表数据项关系列表,
    3.4 加载FormulaLinkRangeList报表公式对应联动单元格列表
    3.5 加载RangeLinkControlList报表单元格控件联动单元格列表 3.6 加载FormulaDisplayObjList公式显示对象 3.7 加载ReportChartObjCollection 图表
    3.8 加载CellFormularItemList 单元格对应公式列
    3.9 加载SheetObjList 报表sheet对象 3.10 加载FormulaSingleCollections对象 3.11 加载FormulaComposeCollection 3.12 加载FormulaMRefCollection 3.13 PictureObjCollection 3.14 FusionChartCollection 3.15 DatabaseCellCollection 3.16 ReportVerifyObj

  4. GetReportFormulaList 获取数据源详细信息包含输入,输出参数,sql语句等

  5. SetDataControlDropdownListDictionaries 如果用到控件,设置控件集合
  6. 开始计算值
  7. --DecryptWorkbooks解密,如果文件加密了,先解密
  8. --CalculateSingleFormulasPreview计算单值公式,(分析,计算,渲染)
  9. --CalculateMRefFormulasPreviewZ计算REF公式.
  10. --ReportFormulaCalculateMulti 计算多数据源公式(先分析用到的数据源,然后遍历执行,按公式定义再做二次处理,
  11. 开始渲染数据
  12. --使用spreadgear的方法,根据路径加载模板xls文件,得到IWorkbook对象[DisplayWorkbook]
  13. --解密文件
  14. --构造FormulaDisplayClass对象,执行DisplayMainSheet方法
  15. -----RegionDisplay(刷新excel公式,清空公式的原始内容,

sunpander -java C#。
Published under (CC) BY-NC-SA in categories tagged with